﻿/* Autor: Achim Schnell */

using System;
using System.Reflection;
using AppFx.Reflection.Attributes;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Tests.Reflection
{
    /// <summary>
    ///Dies ist eine Testklasse für "Test_AttributeHelper" und soll
    ///alle Test_AttributeHelper Komponententests enthalten.
    ///</summary>
	[TestClass]
	public class Test_AttributeHelper
	{
		[TestMethod]
		[Description("Testet, ob der AttributeHelper die Verwendung eines Attributs feststellen kann.")]
		public void Can_DetectAttributeUsage()
		{
			Type objType = typeof(TestClass);
			PropertyInfo nameInfo = objType.GetProperty("Name");

			System.ComponentModel.BrowsableAttribute[] attributes = null;
			Assert.IsTrue(AttributeHelper.IsAttributeUsed<System.ComponentModel.BrowsableAttribute>(nameInfo, ref attributes));
		}

		[TestMethod]
		[Description("Testet, ob der AttributeHelper die (Nicht-)Verwendung eines Attributs feststellen kann.")]
		public void Can_DetectNoAttributeUsage()
		{
			Type objType = typeof(TestClass);
			PropertyInfo name2Info = objType.GetProperty("Name2");

			System.ComponentModel.BrowsableAttribute[] attributes = null;
			Assert.IsFalse(AttributeHelper.IsAttributeUsed<System.ComponentModel.BrowsableAttribute>(name2Info, ref attributes));
			Assert.IsTrue(attributes == null);
		}

		[TestMethod]
		[Description("Testet, ob der AttributeHelper beim Aufruf der Methode 'IsAttributeUsed' mit NULL-PropertyInfo mit einer ArgumentNullException reagiert.")]
		[ExpectedException(typeof(ArgumentNullException))]
		public void Throws_ArgumentNullException_OnNullPropertyInfoInIsAttributeUsed()
		{
			System.ComponentModel.BrowsableAttribute[] attributes = null;
			AttributeHelper.IsAttributeUsed<System.ComponentModel.BrowsableAttribute>(null, ref attributes);
		}

		[TestMethod]
		[Description("Testet, ob der AttributeHelper beim Aufruf der Methode 'GetAttributeValue' mit NULL-ObjectValue mit einer ArgumentNullException reagiert.")]
		[ExpectedException(typeof(ArgumentNullException))]
		public void Throws_ArgumentNullException_OnNullObjectValue()
		{
			AttributeHelper.GetAttributeValue<bool>(null, "nnn");
		}

		[TestMethod]
		[Description("Testet, ob der AttributeHelper beim Aufruf der Methode 'GetAttributeValue' mit NULL-PropertyName mit einer ArgumentNullException reagiert.")]
		[ExpectedException(typeof(ArgumentNullException))]
		public void Throws_ArgumentNullException_OnNullPropertyName()
		{
			AttributeHelper.GetAttributeValue<bool>(null, null);
		}

		[TestMethod]
		[Description("Testet, ob der AttributeHelper beim Aufruf der Methode 'GetAttributeValue' mit einem nicht existierenden PropertyName mit einer MissingMemberException reagiert.")]
		[ExpectedException(typeof(MissingMemberException))]
		public void Throws_MissingMemberException_OnNullPropertyName()
		{
			AttributeHelper.GetAttributeValue<bool>(new object(), "xyz");
		}

		internal class TestClass
		{
			[System.ComponentModel.Browsable(true)]
			public string Name { get; set; }
			public string Name2 { get; set; }
		}
	}
}
